#include "mon_piano_damour.h"
#include "interface/surface_texte.h"
#include "interface/texte_editable.h"
#include "temps/minuterie.h"
#include "temps/cycle.h"
#include "client.h"
#include "serveur.h"
#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
#include <ctime>

#define LATENCE_MINIMUM 100

namespace {
	std::string fond_au_hasard() {
		// temps::maintenant() donne le temps depuis le
		// démarrage du programme seulement...
		srand(time(0));
		std::ostringstream os;
		os << "fond_" << rand()%4+1 << ".png";
		return os.str();
	}
}

mon_piano_damour::mon_piano_damour()
:
fond_ecran_(fond_au_hasard()),
zone_bouton_quitter_(10, 113, 34, 34),
bouton_quitter_(zone_bouton_quitter_)
{
	module_interface &mon_interface_ = module_interface::instance();
	// On boucle pour pouvoir revenir au menu
	do {
		bool lancer_client = false;
		// Ce bloc délimite l'écran de choix
		{
			surface_image fond_ecran_choix("ballot_screen.png");
			surface_immaterielle zone_choix_client(5, 141, 127, 104);
			surface_immaterielle zone_choix_serveur(174, 136, 141, 113);
			bouton_poussoir<> btn_client(zone_choix_client);
			bouton_poussoir<> btn_serveur(zone_choix_serveur);
			
			while(!mon_interface_.doit_quitter() && !btn_client() && !btn_serveur()) {
				cycle<50> c;
				mon_interface_.traiter_evenements();
				mon_interface_.actualiser_affichage();
			}
			
			if(btn_client())
				lancer_client = true;
		}
		
		// Si la directive n'est pas de quitter, c'est qu'il
		// faut faire quelque chose (lancer le client/lancer
		// le serveur)
		if(!mon_interface_.doit_quitter()) {
			// Mise en place du bouton "retour au menu"
			surface_image img_menu("retouraumenu.png", 20, 43, true, 1);
			bouton_poussoir<> btn_menu(img_menu);
			
			// Lancer le client
			if(lancer_client) {
				surface_image fond_connexion("connexion.png");
				surface_image img_connexion("bouton_connexion.png", 248, 170);
				surface_texte lbl_pbs_connexion(" ", false, 45, 119);
				while(!mon_interface_.doit_quitter() && !btn_menu()) {
					bouton_poussoir<> btn_connexion(img_connexion);
					texte_editable<valider_adresses_et_hotes> txt_adresse("localhost", true, 26, 152);
					while(!mon_interface_.doit_quitter() && !btn_menu() && !btn_connexion() && !txt_adresse.touche_entree_appuyee()) {
						cycle<20> c;
						mon_interface_.traiter_evenements();
						mon_interface_.actualiser_affichage();
					}
					
					if(mon_interface_.doit_quitter() || btn_menu())
						break;
					
					// Lance le client
					fond_connexion.visible(false);
					img_connexion.visible(false);
					std::string ancien_txt_adresse = txt_adresse.texte_entre();
					txt_adresse.visible(false);
					lbl_pbs_connexion.visible(false);
					img_menu.visible(false);
					try {
						client mon_client_damour(txt_adresse.texte_entre());
					} catch(erreur const& e) {
						lbl_pbs_connexion.texte(e);	
					}
					fond_connexion.visible(true);
					img_connexion.visible(true);
					lbl_pbs_connexion.visible(true);
					txt_adresse.visible(true);
					txt_adresse.texte_entre(ancien_txt_adresse);
					img_menu.visible(true);
				}
			}
			// Lancer le serveur
			else {
				int latence_souhaitee = 0;
				std::ostringstream ostlatence;
				ostlatence << "Latence voulue : (>= " << LATENCE_MINIMUM << "ms)";
				surface_texte lbl_latence(ostlatence.str(), false, 80, 58);
				surface_image img_confirmer("confirmer.png", 190, 78, true, 10);
				
				std::ostringstream osttxtlatence;
				osttxtlatence << LATENCE_MINIMUM;
				
				while(latence_souhaitee < LATENCE_MINIMUM) {
					texte_editable<valider_chiffres> txt_latence(osttxtlatence.str(), true, 80, 68, true, 0, "_ ms");
					bouton_poussoir<> btn_confirmer(img_confirmer);
					while(!mon_interface_.doit_quitter() && !btn_menu() && !txt_latence.touche_entree_appuyee() && !btn_confirmer())  {
						cycle<50> c;
						mon_interface_.traiter_evenements();
						mon_interface_.actualiser_affichage();
					}
						
					if(mon_interface_.doit_quitter() || btn_menu())
						break;
					
					std::istringstream is(txt_latence.texte_entre());
					is >> latence_souhaitee;
					
					if(latence_souhaitee < LATENCE_MINIMUM)
						lbl_latence.texte("Latence incorrecte. Veuillez recommencer.");
					else {
						// Lance le serveur
						img_menu.visible(false);
						txt_latence.visible(false);
						lbl_latence.visible(false);
						img_confirmer.visible(false);
						try {
							serveur mon_serveur_damour(latence_souhaitee);
						} catch(erreur const& e) {
							lbl_latence.texte(e);
						}
						latence_souhaitee = 0;
						img_menu.visible(true);
						txt_latence.visible(true);
						lbl_latence.visible(true);
						img_confirmer.visible(true);
					}
				}
					
			}
		}
	} while(!mon_interface_.doit_quitter());

}
